Użytkownik:Skradacz/Sandbox
Dobrze, szablony były całkiem spoko, jednak magia dopiero się zacznie. Do utworzenia swoich własnych, magicznych szablonów, przyda się jednak parę zaklęć. Te zaklęcia nazywają się u nas słowami magicznymi (ang. magic words). Są to pewne wyrażenia, które są w specyficzny sposób przetwarzane przez parser artykułów MediaWiki. Pierwszym, najprosztszym sortem słów magicznych są przełączniki zachowań. Jak nazwa wskazuje, zmieniają one sposób zachowania parsera. Te słowa magiczne są wyrażeniami złożonymi z dużych liter, otoczonych z obu stron znakami podkreśleń. Ja wymagam od was znajomości raptem czterech z nich: * - powoduje, że spis treści nie jest wyświetlany. Słowo umieszcza się na początku artykułu * __FORCETOC__ - wymusza pokazanie spisu treści. Słowo umieszcza się na początku artykułu * __TOC__ - parser wstawia w miejsce słowa spis treści (dzięki temu można umieścić go w dowolnym miejscu) * - powoduje, że kategoria jest ukryta. Słowo musi pojawić się w opisie kategorii Ale to nam się zbytnio nie przyda przy tworzeniu szablonów. Na nieodzowny zestaw narzędzi, wykorzystywanych przez twórców skomplikowanych systemów szablonowych, składają się trzy rodzaje słów: * Kontrolery transkluzji - wskazują one parserowi, które elementy artykułów mają być transkludowane, które nie, a które mają być dołączane wyłącznie podczas wklejania. Mają postać par znaczników, pdobnych do znaczników HTML/XML, np. (obejmowana treść) * Referencje zmiennych - są to wyrażenia, w których miejsce parser MediaWiki dostarcza przeróżne wartości, na przykład nazwa artykułu, data i godzina, statystyki Wiki, numer i stempel czasowy bieżącej wersji. Można się od nich odwoływać podobnie jak podczas transkluzji. Nazwę zmiennej, złożoną z dużych liter, należy otoczyć podwójnymi klamrami. W procesie przetwarzania, wyrażenia te zostaną zastąpione przez wartości zmiennych (można stosować przedrostek subst:, aby te wartości wkleić na stałe). Wzorzec: . Czasami referencje przyjmują dodatkowy parametr, wówczas podaje się go po nazwie zmiennej i dwukropku. * Funkcje parsera - jak nazwa wskazuje, są to funkcje dostarczane przez parser, umożliwiające dynamiczne przetwarzanie danych w trakcie interpretacji kodu szablonu. Mają podobną budowę do wyrażeń transkluzyjnych, z jedną tylko różnicą - pomiędzy nazwą funkcji a pierwszym parametrem występuje nie pionowa kreska, ale dwukropek. Nazwy niektórych funkcji parsera są poprzedzone znakiem hash #. Wzorzec: , Kontrolery transkluzji Dotychczas nasz interpreter, podczas procesu transkluzji importował wszystko jak leci, całą zawartość wklejanego artykułu. Można powiedzieć że jest to zachowanie asertywne. Charakteryzuje się ono tym, że objęte tym zachowaniem fragmenty tekstu są widoczne podczas wklejania. Można je jednak zmienić. Najbardziej charakterystyczną sytuacją, przy której musimy zadbać o zmianę zachowania transkluzji, jest próba kategoryzacji szablonów. Jak doskonale wiecie, do kategorii przypisujemy poprzez umieszczenie wewnątrz artykułu linku do odpowiedniej kategorii. Szablony zachowują się tak samo. Niestety, w ich przypadku napotykamy na solidny problem. Gdy umieścimy link do kategorii, zostanie on przeklejony zawsze, gdy użyjemy szablonu. Czasami jest to przydatne, jednak zazwyczaj uznaje się za bardzo niepożądane zjawisko. Wyobraźmy sobie, że chcemy zebrać w jednej kategorii wszystkie zakładki użytkowników. Ale po kategoryzacji okazuje się, że w kategorii z zakładkami odnajdziemy profilówki wszystkich użytkowników, którzy z nich korzystają! Regularny groch z kapustą. To była sytuacja autentyczna - gdy Fretka wprowadziła zakładki na naszej Wiki :) Chcemy zatem, by jakiś kawałek naszego artykułu - w tym wypadku link do kategorii - nie był dołączany wraz z szablonem podczas transkluzji. Tu poznamy pierwszy kontroler o znaczącej nazwie . Fragmenty otoczone parą znaczników będą się pojawiały, gdy odwiedzimy artykuł szablonu, ale znikną, gdy spróbujemy wkleić szablon. Można to nazwać zachowaniem nieśmiałym. U siebie pokazuje swoją treść, ale na zewnątrz się trochę boi :) Inne użycia zachowania nieśmiałego to np. tworzenie dokumentacji szablonów. Gdy user wchodzi na stronę szablonu, będzie mógł zapoznać się ze sposobem jego użycia. Żywy przykład: Pójdę zniszczyć Pierścień, ale trochę się boję... Jednak problem można odwrócić. Chcemy np. utworzyć navbox, który będzie automatycznie kategoryzował artykuły, w których jest umieszczony jako główne bohaterki. Niestety, w tak kompletowanej kategorii odnajdziemy nie tylko artykuły, ale i... nasz szablon! Co zrobić? Otóż rozwiązanie jest proste: musimy link do kategorii otoczyć kontrolerem o nazwie includeonly. Fragmenty opakowane w ten kontroler będą niewidoczne, gdy odwiedzimy sam szablon, ale ujawnią się podczas wklejania. To można nazwać zachowaniem ekstrawertycznym. Szablon lansuje się na zewnątrz. Ekstrawetykę transkuzji będziecie stosować bardzo często! Systemy szablonów, wyposażone w wiele subszablonów, pobierających potężne ilości parametrów, zwyczajnie nie nadają się do zwykłego wywoływania, bez transkuzji. Dlatego powinniśmy ukrywać ich zawartość poprzez ... Kod szablonu.... Zamiast nich, możemy zaserwować np. dokumentację użycia, załączoną, oczywiście, przy użyciu noinclude :) Składając do kupy, porównajmy równe sposoby kontrolowania transkluzji: Ten kod zachowuje się asertywnie Ten kod zachowuje się nieśmiało Ten kod zachowuje się ekstrawertycznie Strona szablonu Ten kod zachowuje się asertywnie Ten kod zachowuje się nieśmiało Po wklejeniu Ten kod zachowuje się asertywnie Ten kod zachowuje się ekstrawertycznie Referencje zmiennych Zacznijmy od zmiennych. Wyobraźmy sobie, że chcemy ozyskać dostęp do nazwy artykułu, który obecnie piszemy. Tak się składa, że parser udostępnia zmienną o nazwie PAGENAME, zawierającą nazwę strony (bez przestrzeni nazw), zatem zmienna użyta na stronie Pomoc:Ala/Ma/Kota''zwróci ''Ala/Ma/Kota. Aby uzyskać do niej dostęp, korzystamy z . W jej miejsce, parser wstawia wartość zmiennej. Potęga mechanizmu zmiennych objawia się szczególnie w transkluzji, gdyż podczas wstawiania fragmentów obcych artykułów, zmienne przejmują wartości artykułu bazowego. Objaśnię to na prostym przykładzie. Utwórzmy szablon o następującej zawartości: Witaj na stronie ! Gdy wejdziemy na stronę szablonu, zobaczymy: Witaj na stronie Powitanie! Zastanówmy się jednak, co się stanie, gdy wstawimy szablon na jakąś stronę? Jaką wartość zwróci zmienna? Okaże się, że szablon wstawiony np. do strony Rainbow Dash, będzie wyglądał następująco: Witaj na stronie Rainbow Dash! Viola! Nasz szablonik sam wywnioskował, jak nazywa się strona, na której został osadzony! Czyż to nie cudowne? Teraz jakiś bardziej użyteczny przykład. Chcielibyśmy utworzyć szablon z komunikatem informującym o tym, że treść artykułu jest sporna, i umieścić w nim link do strony dyskusji. Tu z pomocą przychodzi zmienna . Zwraca ona pełen tytuł strony dyskusji, odpowiadającej artykułowi. Wystarczy zatem bardzo trywialny w budowie szablonik, nie przyjmujący nawet żadnych parametrów, wszystko bowiem co potrzebuje, czerpie ze zmiennych: Niniejszy artykuł zawiera treści uznane za kontrowersyjne. Aby poznać przedmiot sporu, zajrzyj do strony dyskusji. Trudno wyznaczyć listę zmiennych, które są najbardziej przydatne. Trzeba po prostu biegle poruszać się po ich dokumentacji. Funkcje parsera To teraz czas na coś, co misie lubią najbardziej, czyli funkcje parserów. Bez nich szablony byłyby bardzo ubogie, ale z nimi wikiskładnia staje się wręcz językiem skryptowym, zaś szablony uzyskują status niewielkich skryptów. No dobra, ale od czego zacząć? Najważniejsza grupa funkcji parsera jest nazywana przeze mnie grupą hashową, gdyż ich nazwy zaczynają się od znaku hash właśnie. Oto przykład najprostszej funkcji z tej grupy, mianowicie funkcja #expr: Ta funkcja, mówiąc bardzo ogólnie, oblicza wartość podanego wyrażenia i wynik wstawia w jej miejsce, podczas wyświetlania artykułu, szablonu. Takie wyrażenia składają się z dwóch poprzeplatanych odpowiednio rodzajów elementów: * Wartości - są to liczby (całkowite lub zmiennoprzecinkowe), np. 0, 4, -7, 1.33333 * Operatory - funkcje operujące na dostarczonych wartościach (tzw. argumentach). Operatory przyjmują jeden argument (np. cos) lub też dwa (np. +'', ''mod). Obliczanie wyrażenia oznacza wykonanie operatorów zgodnie z odpowiednią kolejnością (o tym powiemy sobie nieco później). Wynik wykonania ich wszystkich jest zwracany przez funkcję #expr. Zamiast jednak uczyć was żmudnie składni, obejrzyjcie kilka banalnych przykładów, mam nadzieję że sami wychwycicie, jak powinno się formułować takie wyrażenia. Oto kilka prostych operatorów: * ↔ (nic) * ↔ 127 * ↔ 4 * ↔ 50 * ↔ 6 * ↔ -7 * ↔ 2 (reszta z dzielenia) * ↔ (potęgowanie) * ↔ * ↔ (obcięcie miejsc po przecinku) * ↔ (zakrąglenie w górę) * ↔ (prawidłowe matematyczne zaokrąglenie) * ↔ (wartość bezwzględna) Operatory można łączyć, np. ↔ . Zwróćcie uwagę na kolejność wykonywanych działań :) Zwróćcie również uwagę, że zamiast przecinków, w liczbach używamy KROPEK. Oprócz typowych, szkolnych operatorów działań, mamy jeszcze operatory logiczne. Jak wiecie lub nie, takie operatory przyjmują wartości logiczne: prawda, reprezentowana przez jakąkolwiek liczbę inną niż zero, albo fałsz, prezentowany przez liczbę zero. Zwracają one wskutek działania również prawdę (1) lub fałsz (0). Prostym operatorem logicznym jest operator and, który zwraca prawdę tylko wtedy, gdy oba argumenty są prawdą. Oto przykład: * ↔ * ↔ * ↔ * ↔ Innym operatorem logicznym z dwoma argumentami jest or, który zwraca prawdę, gdy chociaż jeden z argumentów jest prawdziwy. Warto również zwrócić uwagę na operator nor, biorący tylko jeden argument, który zaprzecza otrzymaną wartość, tj. dla prawdy zwraca fałsz, a dla fałszu zwraca prawdę, np. * ↔ * ↔ Ostatnią ciekawą grupą operatorów jest grupa operatorów porównania. Podobnie jak operatory logiczne, zwracają 1 lub 0. Zajmują się one badaniem, w jakiej relacji znajdują się podane wyrażenia. Dopuszczalne operatory to: =, >, <, <> (nierówność), >=, <= (większy/mniejszy lub równy). Przykłady: * ↔ * ↔ * ↔ * ↔ * ↔ Jeszcze jedna ważna sprawa odnośnie wyrażeń - czasem przyda się wam konwersja pomiędzy typami wartości, bo np. operator mod będzie potrzebował koniecznie wartości całkowitych, zatem zwróci nam błąd. Domyślnie wprowadzane wartości są uznawane za zmiennoprzecinkowe. Jeżeli jednak nie mają żadnych miejsc po przecinku, mogą być traktowane jako całkowite. Aby przekonwertować typ zmiennoprzecinkowy na całkowity, użyj trunc, np trunc0.5. Ufff, udało się :) Teraz poznamy jeszcze jedną funkcyjkę, nazywaną #ifexpr. Bada ona, czy obliczone wyrażenie jest prawdziwe (niezerowe) lub fałszywe (równe zeru) i w zależności od wyniku obliczeń zwraca odpowiednią wartość. Wzór: Zadanie Ponieważ mieliście z mojej winy długą labę, czas przystąpić do pracy. Oto specyfikacja zadania, które spróbujemy wspólnie wykonać. Do jego wykonania w zupełności wystarcza wiedza, którą zdobyliśmy dotychczas. Należy wykonać szablon badający prawidłowość głosowania na wiki. Jak wiecie, na Wiki głosuje się poprzez podpisanie pod listą optującą za określonym rozwiązaniem, np. usunięciem artykułu. Mamy dwie sekcje, dajmy na to - "za" i "przeciw". Jak również wiadomo, każde głosowanie odbywa się w określonym czasie. Głosy oddane po tym czasie są uznawane za nieważne. Szablon ma informować, czy głosowanie jeszcze trwa, a jeśli już się zakończyło - czy nikt nie dopisał głosu po ustalonym terminie Wstęp do rozwiązania Najpierw zaprojektujmy wywołanie szablonu i jakie parametry będziemy podawać: Jak widać, w wywołaniu brakuje nam kilku istotnych informacji. Po pierwsze - nie wiemy, jaka jest TERAZ data i godzina:) Bez tego nie będziemy wiedzieli, czy głosowanie są skończyło, czy też nie. Tu z pomocą przychodzą nam zmienne od parsera, które bez trudu odnajdziemy w dokumentacji MW: Zmienne daty i godziny. Zadanie 2a. Rozpisz wyrażenie, które porównuje datę i godzinę podaną w parametrach oraz bieżącą datę i godzinę, dostarczone przez zmienne. Wyrażenie ma zwracać prawdę, jeżeli głosowanie jeszcze trwa. Wskazówka: Zwróćcie uwagę, że chodzi tutaj o porównywanie coraz dokładniejszych wartości: * Jeżeli rok teraz jest mniejszy niż rok zakończenia, zwróć prawdę, w przeciwnym wypadku: ** Jeżeli miesiąc teraz jest mniejszy niż miesiąc zakończenia, zwróć prawdę, w przeciwnym wypadku: *** Jeżeli dzień... **** (...) ***** ...minuta zakończenia, zwróć prawdę, w przeciwnym wypadku: ****** Zwróć fałsz Starajcie się nie zagnieżdżać funkcji #expr, a zamiast nich stosować operatory logiczne.